From: kaf24@firebug.cl.cam.ac.uk Date: Tue, 17 Jan 2006 13:24:42 +0000 (+0100) Subject: Remove the spin on VCPUF_running from context_switch(). X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16541^2~19 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22?a=commitdiff_plain;h=af8becc6b9cf5c23eba11be6d675d58e5c1ecfcb;p=xen.git Remove the spin on VCPUF_running from context_switch(). It doesn't work because we already set VCPUF_running locally, and the scheduler should not pick another CPU's VCPUF_running VCPU anyway, since it mustn't modify the processor field. Instead just add a simple assertion to the scheduler to ensure the scheduling algorithm is not picking an inappropriate VCPU. Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 25746ab4f1..759bbadb21 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -738,9 +738,6 @@ void context_switch(struct vcpu *prev, struct vcpu *next) ASSERT(cpus_weight(dirty_mask) <= 1); if ( unlikely(!cpu_isset(cpu, dirty_mask) && !cpus_empty(dirty_mask)) ) { - /* Make sure the next VCPU is not in a scheduling tail. */ - while ( test_bit(_VCPUF_running, &next->vcpu_flags) ) - cpu_relax(); /* Other cpus call __sync_lazy_execstate from flush ipi handler. */ if ( !cpus_empty(next->vcpu_dirty_cpumask) ) flush_tlb_mask(next->vcpu_dirty_cpumask); diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 94b40559da..0ffa53a8fa 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -420,6 +420,7 @@ static void __enter_scheduler(void) } #endif + ASSERT(!test_bit(_VCPUF_running, &next->vcpu_flags)); set_bit(_VCPUF_running, &next->vcpu_flags); spin_unlock_irq(&schedule_data[cpu].schedule_lock);